/* abc - The AspectBench Compiler
 * Copyright (C) 2004 Ganesh Sittampalam
 * Copyright (C) 2004 Ondrej Lhotak
 *
 * This compiler is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This compiler is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this compiler, in the file LESSER-GPL;
 * if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

package abc.weaving.residues;

import polyglot.util.InternalCompilerError;
import soot.*;
import soot.jimple.*;
import abc.soot.util.LocalGeneratorEx;
import abc.weaving.weaver.Weaver;
import abc.weaving.weaver.*;


/** A context value that comes directly from a 
 *  jimple value already in the current method
 *  @author Ganesh Sittampalam
 *  @author Ondrej Lhotak
 *  @date 30-Apr-04
 */ 

public class JimpleValue extends ContextValue {

    private Immediate value;

    public ContextValue inline(ConstructorInliningMap cim) {
        if( value instanceof Local ) 
            return new JimpleValue(cim.map((Local) value));
        if( value instanceof Constant )
            return new JimpleValue(value);
        throw new InternalCompilerError("Unhandled Immediate: "+value);
    }
    public JimpleValue(Immediate value) {
	if(value==null) 
	    throw new InternalCompilerError("JimpleValue constructed with null argument");
	this.value=value;
    }

    public String toString() {
	return "jimplevalue("+value+")";
    }

    public Type getSootType() {
	return value.getType();
    }

    public Value getSootValue() {
    	Value v=(Value) abc.main.Main.v().getAbcExtension().getWeaver().getUnitBindings().get(value);
    	if (v != null)
    		return v;
    	else
    		return value;
    }

}
